//
// Created by Immortal on 4/24/2021.
//

#include "OpStr.h"



int OpStr::FindStr(const char* src, int nSrc, const char* dst, int nDst, int nStart)
{
    int i = 0;
    int j = 0;

    char chDst1 = dst[0];

    //遍历源数据
    for(i = nStart; i < nSrc; i++)
    {
        //判断第一个数据
        if(src[i] != chDst1)
        {
            continue;
        }

        //判断索引是否超出源数据长度
        if(i > nSrc - nDst)
        {
            break;
        }

        //判断
        for(j = 0; j < nDst; j++)
        {
            if(src[i + j] != dst[j])
            {
                break;
            }
        }

        if(j == nDst)
        {
            //查询成功
            return i;
        }
    }


    return -1;
}




bool OpStr::SplitStr(const char* src, int nSrc, const char* dst, int nDst, std::vector<std::string>* pvStr, bool bOnce)
{
    //查询其实位置
    int nStart = 0;
    //是否成功
    bool bSuccessful = false;
    //当前索引
    int nIndex = 0;

    //判断传出参数是否为空
    if(pvStr == nullptr)
    {
        return false;
    }

    //查询指定数据
    while((nIndex = OpStr::FindStr(src, nSrc, dst, nDst, nStart)) != -1)
    {
        if(nIndex > nStart)
        {
            //添加到传出参数
            std::string strData;
            strData.append((src + nStart), nIndex - nStart);
            pvStr->push_back(strData);
        }

        //计算下一个起始位置
        nStart = nIndex + nDst;

        //成功
        bSuccessful = true;

        if(bOnce == true)
        {
            break;
        }
    }

    if(nStart < nSrc)
    {
        //添加到传出参数
        std::string strData;
        strData.append((src + nStart), nSrc - nStart);
        pvStr->push_back(strData);
    }

    return bSuccessful;

}

